from django.conf import settings
from rest_framework import serializers
from .models import User
from django_redis import get_redis_connection
from django.core.mail import send_mail
from celery_tasks.email.tasks import send_verify_url
from .models import Address

class RegisterUserSerializer(serializers.ModelSerializer):
    #写出没有定义的字段，　　CharField字符串类型　　label标记　　　　　write_only 只写
    password2 = serializers.CharField(min_length=8, max_length=20, label="确认密码", write_only=True)
    sms_code = serializers.CharField(min_length=6, max_length=6, label="短信验证码", write_only=True)
    allow = serializers.CharField(label="协议", write_only=True)
    token = serializers.CharField(label="jwt口令", read_only=True)
    class Meta:
        #模型累继承于User
        model = User
        #要验证的字段有那些
        fields=("id","username","password","password2","mobile","sms_code","allow","token")
        #为需要增加属性的字段增加字段　　　只读的字段
        read_only_field = ("id")
        extra_kwargs = {
            "password": {
                "min_length": 8,
                "max_length": 20,
                "write_only": True
            }
        }
        #单字段校验

            # 1,单字段校验,allow协议
    def validate_allow(self, value):
        if value != 'true':
            raise serializers.ValidationError("必须同意协议")

        return value
        #多字段校验

    # 2,校验多字段, 密码, 短信
    def validate(self, attrs):

        # 0,取出手机号,和短信验证码
        sms_code = attrs["sms_code"]
        mobile = attrs["mobile"]

        # 1,校验密码
        if attrs["password"] != attrs["password2"]:
            raise serializers.ValidationError("两次密码不相等")

        # 2,校验短信
        #推测是跟redis的一种方式
        redis_conn = get_redis_connection("code")
        #从ｒｅｄｉｓ里面去除手机号对应的短信验证码
        redis_sms_code = redis_conn.get("sms_code_%s" % mobile)

        # 3,判断是否过期
        if not redis_sms_code:
            raise serializers.ValidationError("短信验证码已经过期")

        # 4,校验正确性
        if sms_code != redis_sms_code.decode():
            raise serializers.ValidationError("短信验证码填写错误")

        #5,返回
        return attrs

    #3,由于User中没有password2,sms_code,allow,所以需要去除
    def create(self, validated_data):
        #1,去除不需要的数据
        del validated_data["password2"]
        del validated_data["sms_code"]
        del validated_data["allow"]

        #2,创建对象
        #这是一个父类的方法
        user = super(RegisterUserSerializer, self).create(validated_data)
        #加密密码
        user.set_password(validated_data["password"])
        user.save()
        #增加ＪＷＴ方式保持状态
        from rest_framework_jwt.settings import api_settings

        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        user.token = token

        #3,返回
        return user

class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("id","username","mobile","email","email_active")

class EmailSendSerializer(serializers.Serializer):
    email = serializers.EmailField(label="邮箱")

    def update(self, instance, validated_data):
        # instance, validated_data，上面的两个参数不知道施舍呢什么鬼，估计一个是封装好的模型类参数，一个是json数据
        email = validated_data["email"]
        instance.email = email
        instance.save()
        # 发送邮件
        verify_url = instance.generate_verify_url()
        # send_mail(subject="请点击验证，来自美多国际商城",message=verify_url,from_email=settings.EMAIL_FROM,recipient_list=[email])
        send_verify_url.delay(verify_url, email)
        return validated_data

class AddressSerializer(serializers.ModelSerializer):

    province = serializers.StringRelatedField(read_only=True)
    city = serializers.StringRelatedField(read_only=True)
    district = serializers.StringRelatedField(read_only=True)
    province_id = serializers.IntegerField(label="省id")
    city_id = serializers.IntegerField(label="市id")
    district_id = serializers.IntegerField(label="区id")

    class Meta:
        model = Address
        exclude = ("user", "is_deleted", "create_time", "update_time")

    def create(self, validated_data):
        validated_data["user"] = self.context["request"].user
        return super(AddressSerializer, self).create(validated_data)

class AddressTitleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Address
        fields = ("title",)

